# Blocking I/O & Non-Blocking I/O
I/O ์์ ์ Kernel level์์๋ง ์ํํ ์ ์๋ค. ๋ฐ๋ผ์, Process, Thread๋ ์ปค๋์๊ฒ I/O๋ฅผ ์์ฒญํด์ผ ํ๋ค.
# Blocking I/O
I/O Blocking ํํ์ ์์ ์
(1) Process(Thread)๊ฐ Kernel์๊ฒ I/O๋ฅผ ์์ฒญํ๋ ํจ์๋ฅผ ํธ์ถ
(2) Kernel์ด ์์ ์ ์๋ฃํ๋ฉด ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ ๋ฐ์.
- ํน์ง
- I/O ์์ ์ด ์งํ๋๋ ๋์ user Process(Thread) ๋ ์์ ์ ์์ ์ ์ค๋จํ ์ฑ ๋๊ธฐ
- Resource ๋ญ๋น๊ฐ ์ฌํจ
(I/O ์์ ์ด CPU ์์์ ๊ฑฐ์ ์ฐ์ง ์์ผ๋ฏ๋ก)
์ฌ๋ฌ Client ๊ฐ ์ ์ํ๋ ์๋ฒ๋ฅผ Blocking ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒฝ์ฐ
-> I/O ์์ ์ ์งํํ๋ ์์ ์ ์ค์ง -> ๋ค๋ฅธ Client๊ฐ ์งํ์ค์ธ ์์ ์ ์ค์งํ๋ฉด ์๋๋ฏ๋ก, client ๋ณ๋ก ๋ณ๋์ Thread๋ฅผ ์์ฑํด์ผ ํจ -> ์ ์์ ์๊ฐ ๋งค์ฐ ๋ง์์ง์ด๋ก ์ธํด, ๋ง์์ง Threads ๋ก ์ปจํ ์คํธ ์ค์์นญ ํ์๊ฐ ์ฆ๊ฐํจ,,, ๋นํจ์จ์ ์ธ ๋์ ๋ฐฉ์
- ํน์ง
# Non-Blocking I/O
I/O ์์ ์ด ์งํ๋๋ ๋์ User Process์ ์์ ์ ์ค๋จํ์ง ์์.
์งํ ์์
User Process๊ฐ recvfrom ํจ์ ํธ์ถ (์ปค๋์๊ฒ ํด๋น Socket์ผ๋ก๋ถํฐ data๋ฅผ ๋ฐ๊ณ ์ถ๋ค๊ณ ์์ฒญํจ)
Kernel์ ์ด ์์ฒญ์ ๋ํด์, ๊ณง๋ฐ๋ก recvBuffer๋ฅผ ์ฑ์์ ๋ณด๋ด์ง ๋ชปํ๋ฏ๋ก, "EWOULDBLOCK"์ returnํจ.
Blocking ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ, User Process๋ ๋ค๋ฅธ ์์ ์ ์งํํ ์ ์์.
recvBuffer์ user๊ฐ ๋ฐ์ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ, Buffer๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ์ฌ ๋ฐ์์ด.
์ด๋, recvBuffer๋ Kernel์ด ๊ฐ์ง๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋์ด ์์ผ๋ฏ๋ก, Memory๊ฐ ๋ณต์ฌ๋ก ์ธํด, I/O๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์๋๋ก data๋ฅผ ๋ฐ์์ฌ ์ ์์.
recvfrom ํจ์๋ ๋น ๋ฅธ ์๋๋ก data๋ฅผ ๋ณต์ฌํ ํ, ๋ณต์ฌํ data์ ๊ธธ์ด์ ํจ๊ป ๋ฐํํจ.